#!/usr/bin/env python3
# _*_ coding:utf-8 _*_

import base64
import hashlib
import hmac
import json
import os
import re
import sys
import time
import urllib.parse

import requests

cur_path = os.path.abspath(os.path.dirname(__file__))
root_path = os.path.split(cur_path)[0]
sys.path.append(root_path)

# 通知服务
BARK = ""  # bark服务,自行搜索; secrets可填;
SCKEY = ""  # Server酱的SCKEY; secrets可填
TG_BOT_TOKEN = (
    ""  # tg机器人的TG_BOT_TOKEN; secrets可填1407203283:AAG9rt-6RDaaX0HBLZQq0laNOh898iFYaRQ
)
TG_USER_ID = ""  # tg机器人的TG_USER_ID; secrets可填 1434078534
TG_API_HOST = ""  # tg 代理api
TG_PROXY_IP = ""  # tg机器人的TG_PROXY_IP; secrets可填
TG_PROXY_PORT = ""  # tg机器人的TG_PROXY_PORT; secrets可填
DD_BOT_TOKEN = ""  # 钉钉机器人的DD_BOT_TOKEN; secrets可填
DD_BOT_SECRET = ""  # 钉钉机器人的DD_BOT_SECRET; secrets可填
QQ_SKEY = ""  # qq机器人的QQ_SKEY; secrets可填
QQ_MODE = ""  # qq机器人的QQ_MODE; secrets可填
QYWX_AM = ""  # 企业微信
PUSH_PLUS_TOKEN = ""  # 微信推送Plus+

notify_mode = []

message_info = """"""

# GitHub action运行需要填写对应的secrets
if "BARK" in os.environ and os.environ["BARK"]:
    BARK = os.environ["BARK"]
if "PUSH_KEY" in os.environ and os.environ["PUSH_KEY"]:
    SCKEY = os.environ["PUSH_KEY"]
if (
    "TG_BOT_TOKEN" in os.environ
    and os.environ["TG_BOT_TOKEN"]
    and "TG_USER_ID" in os.environ
    and os.environ["TG_USER_ID"]
):
    TG_BOT_TOKEN = os.environ["TG_BOT_TOKEN"]
    TG_USER_ID = os.environ["TG_USER_ID"]
if "TG_API_HOST" in os.environ and os.environ["TG_API_HOST"]:
    TG_API_HOST = os.environ["TG_API_HOST"]
if (
    "DD_BOT_TOKEN" in os.environ
    and os.environ["DD_BOT_TOKEN"]
    and "DD_BOT_SECRET" in os.environ
    and os.environ["DD_BOT_SECRET"]
):
    DD_BOT_TOKEN = os.environ["DD_BOT_TOKEN"]
    DD_BOT_SECRET = os.environ["DD_BOT_SECRET"]
if (
    "QQ_SKEY" in os.environ
    and os.environ["QQ_SKEY"]
    and "QQ_MODE" in os.environ
    and os.environ["QQ_MODE"]
):
    QQ_SKEY = os.environ["QQ_SKEY"]
    QQ_MODE = os.environ["QQ_MODE"]
# 获取pushplus+ PUSH_PLUS_TOKEN
if "PUSH_PLUS_TOKEN" in os.environ and len(os.environ["PUSH_PLUS_TOKEN"]) > 1:
    PUSH_PLUS_TOKEN = os.environ["PUSH_PLUS_TOKEN"]
# 获取企业微信应用推送 QYWX_AM
if "QYWX_AM" in os.environ and len(os.environ["QYWX_AM"]) > 1:
    QYWX_AM = os.environ["QYWX_AM"]
if BARK:
    notify_mode.append("bark")
    # print("BARK 推送打开")
if SCKEY:
    notify_mode.append("sc_key")
    # print("Server酱 推送打开")
if TG_BOT_TOKEN and TG_USER_ID:
    notify_mode.append("telegram_bot")
    # print("Telegram 推送打开")
if DD_BOT_TOKEN and DD_BOT_SECRET:
    notify_mode.append("dingding_bot")
    # print("钉钉机器人 推送打开")
if QQ_SKEY and QQ_MODE:
    notify_mode.append("coolpush_bot")
    # print("QQ机器人 推送打开")

if PUSH_PLUS_TOKEN:
    notify_mode.append("pushplus_bot")
    # print("微信推送Plus机器人 推送打开")
if QYWX_AM:
    notify_mode.append("wecom_app")
    # print("企业微信机器人 推送打开")


def message(str_msg):
    global message_info
    print(str_msg)
    message_info = f"{message_info}\n{str_msg}"
    sys.stdout.flush()


def bark(title, content):
    print("\n")
    if not BARK:
        print("bark服务的bark_token未设置!!\n取消推送")
        return
    print("bark服务启动")
    try:
        response = requests.get(
            f"""https://api.day.app/{BARK}/{title}/{urllib.parse.quote_plus(content)}"""
        ).json()
        if response["code"] == 200:
            print("推送成功！")
        else:
            print("推送失败！")
    except Exception:
        print("推送失败！")


def serverJ(title, content):
    print("\n")
    if not SCKEY:
        print("server酱服务的SCKEY未设置!!\n取消推送")
        return
    print("serverJ服务启动")
    data = {"text": title, "desp": content.replace("\n", "\n\n")}
    response = requests.post(f"https://sc.ftqq.com/{SCKEY}.send", data=data).json()
    if response["errno"] == 0:
        print("推送成功！")
    else:
        print("推送失败！")


# tg通知


def telegram_bot(title, content):
    try:
        print("\n")
        bot_token = TG_BOT_TOKEN
        user_id = TG_USER_ID
        if not bot_token or not user_id:
            print("tg服务的bot_token或者user_id未设置!!\n取消推送")
            return
        print("tg服务启动")
        if TG_API_HOST:
            if "http" in TG_API_HOST:
                url = f"{TG_API_HOST}/bot{TG_BOT_TOKEN}/sendMessage"
            else:
                url = f"https://{TG_API_HOST}/bot{TG_BOT_TOKEN}/sendMessage"
        else:
            url = f"https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage"

        headers = {"Content-Type": "application/x-www-form-urlencoded"}
        payload = {
            "chat_id": str(TG_USER_ID),
            "text": f"{title}\n\n{content}",
            "disable_web_page_preview": "true",
        }
        proxies = None
        if TG_PROXY_IP and TG_PROXY_PORT:
            proxyStr = f"http://{TG_PROXY_IP}:{TG_PROXY_PORT}"
            proxies = {"http": proxyStr, "https": proxyStr}
        try:
            response = requests.post(
                url=url, headers=headers, params=payload, proxies=proxies
            ).json()
        except Exception:
            print("推送失败！")
        if response["ok"]:
            print("推送成功！")
        else:
            print("推送失败！")
    except Exception as e:
        print(e)


def dingding_bot(title, content):
    timestamp = str(round(time.time() * 1000))  # 时间戳
    secret_enc = DD_BOT_SECRET.encode("utf-8")
    string_to_sign = f"{timestamp}\n{DD_BOT_SECRET}"
    string_to_sign_enc = string_to_sign.encode("utf-8")
    hmac_code = hmac.new(
        secret_enc, string_to_sign_enc, digestmod=hashlib.sha256
    ).digest()
    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))  # 签名
    print("开始使用 钉钉机器人 推送消息...", end="")
    url = f"https://oapi.dingtalk.com/robot/send?access_token={DD_BOT_TOKEN}&timestamp={timestamp}&sign={sign}"
    headers = {"Content-Type": "application/json;charset=utf-8"}
    data = {"msgtype": "text", "text": {"content": f"{title}\n\n{content}"}}
    response = requests.post(
        url=url, data=json.dumps(data), headers=headers, timeout=15
    ).json()
    if not response["errcode"]:
        print("推送成功！")
    else:
        print("推送失败！")


def coolpush_bot(title, content):
    print("\n")
    if not QQ_SKEY or not QQ_MODE:
        print("qq服务的QQ_SKEY或者QQ_MODE未设置!!\n取消推送")
        return
    print("qq服务启动")
    url = f"https://qmsg.zendee.cn/{QQ_MODE}/{QQ_SKEY}"
    payload = {"msg": f"{title}\n\n{content}".encode("utf-8")}
    response = requests.post(url=url, params=payload).json()
    if response["code"] == 0:
        print("推送成功！")
    else:
        print("推送失败！")


# push推送


def pushplus_bot(title, content):
    try:
        print("\n")
        if not PUSH_PLUS_TOKEN:
            print("PUSHPLUS服务的token未设置!!\n取消推送")
            return
        print("PUSHPLUS服务启动")
        url = "http://www.pushplus.plus/send"
        data = {"token": PUSH_PLUS_TOKEN, "title": title, "content": content}
        body = json.dumps(data).encode(encoding="utf-8")
        headers = {"Content-Type": "application/json"}
        response = requests.post(url=url, data=body, headers=headers).json()
        if response["code"] == 200:
            print("推送成功！")
        else:
            print("推送失败！")
    except Exception as e:
        print(e)


# 企业微信 APP 推送


def wecom_app(title, content):
    try:
        if not QYWX_AM:
            print("QYWX_AM 并未设置！！\n取消推送")
            return
        QYWX_AM_AY = re.split(",", QYWX_AM)
        if 4 < len(QYWX_AM_AY) > 5:
            print("QYWX_AM 设置错误！！\n取消推送")
            return
        corpid = QYWX_AM_AY[0]
        corpsecret = QYWX_AM_AY[1]
        touser = QYWX_AM_AY[2]
        agentid = QYWX_AM_AY[3]
        try:
            media_id = QYWX_AM_AY[4]
        except Exception:
            media_id = ""
        wx = WeCom(corpid, corpsecret, agentid)
        # 如果没有配置 media_id 默认就以 text 方式发送
        if not media_id:
            message = title + "\n\n" + content
            response = wx.send_text(message, touser)
        else:
            response = wx.send_mpnews(title, content, media_id, touser)
        if response == "ok":
            print("推送成功！")
        else:
            print("推送失败！错误信息如下：\n", response)
    except Exception as e:
        print(e)


class WeCom:
    def __init__(self, corpid, corpsecret, agentid):
        self.CORPID = corpid
        self.CORPSECRET = corpsecret
        self.AGENTID = agentid

    def get_access_token(self):
        url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
        values = {
            "corpid": self.CORPID,
            "corpsecret": self.CORPSECRET,
        }
        req = requests.post(url, params=values)
        data = json.loads(req.text)
        return data["access_token"]

    def send_text(self, message, touser="@all"):
        send_url = (
            "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="
            + self.get_access_token()
        )
        send_values = {
            "touser": touser,
            "msgtype": "text",
            "agentid": self.AGENTID,
            "text": {"content": message},
            "safe": "0",
        }
        send_msges = bytes(json.dumps(send_values), "utf-8")
        respone = requests.post(send_url, send_msges)
        respone = respone.json()
        return respone["errmsg"]

    def send_mpnews(self, title, message, media_id, touser="@all"):
        send_url = (
            "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="
            + self.get_access_token()
        )
        send_values = {
            "touser": touser,
            "msgtype": "mpnews",
            "agentid": self.AGENTID,
            "mpnews": {
                "articles": [
                    {
                        "title": title,
                        "thumb_media_id": media_id,
                        "author": "Author",
                        "content_source_url": "",
                        "content": message.replace("\n", "<br/>"),
                        "digest": message,
                    }
                ]
            },
        }
        send_msges = bytes(json.dumps(send_values), "utf-8")
        respone = requests.post(send_url, send_msges)
        respone = respone.json()
        return respone["errmsg"]


def send(title, content):
    """
    使用 bark, telegram bot, dingding bot, serverJ 发送手机推送
    :param title:
    :param content:
    :return:
    """
    content += "\n\n开源免费By: https://github.com/curtinlv/JD-Script"
    for i in notify_mode:
        if i == "bark":
            if BARK:
                bark(title=title, content=content)
            else:
                print("未启用 bark")
            continue
        if i == "sc_key":
            if SCKEY:
                serverJ(title=title, content=content)
            else:
                print("未启用 Server酱")
            continue
        elif i == "dingding_bot":
            if DD_BOT_TOKEN and DD_BOT_SECRET:
                dingding_bot(title=title, content=content)
            else:
                print("未启用 钉钉机器人")
            continue
        elif i == "telegram_bot":
            if TG_BOT_TOKEN and TG_USER_ID:
                telegram_bot(title=title, content=content)
            else:
                print("未启用 telegram机器人")
            continue
        elif i == "coolpush_bot":
            if QQ_SKEY and QQ_MODE:
                coolpush_bot(title=title, content=content)
            else:
                print("未启用 QQ机器人")
            continue
        elif i == "pushplus_bot":
            if PUSH_PLUS_TOKEN:
                pushplus_bot(title=title, content=content)
            else:
                print("未启用 PUSHPLUS机器人")
            continue
        elif i == "wecom_app":
            if QYWX_AM:
                wecom_app(title=title, content=content)
            else:
                print("未启用企业微信应用消息推送")
            continue
        else:
            print("此类推送方式不存在")


def main():
    send("title", "content")


if __name__ == "__main__":
    main()
